package net.maku.jw.service.impl;

import net.maku.framework.common.utils.Result;
import net.maku.jw.dao.CourseDao;
import net.maku.jw.entity.Course;
import net.maku.jw.entity.SysMember;
import net.maku.jw.dao.SysMemberDao;
import net.maku.jw.service.SysMemberService;
import net.maku.jw.util.HtmlunitUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

/**
 * 小程用户信息(SysMember表)服务实现类
 *
 * @author makejava
 * @since 2024-04-05 14:15:35
 */
@Service("sysMemberService")
public class SysMemberServiceImpl implements SysMemberService {
    @Resource
    private SysMemberDao sysMemberDao;
    @Resource
    private CourseDao courseDao;

    @Override
    public Long selectLastId() {
        return Long.valueOf(this.sysMemberDao.selectLastId());
    }

    /**\
     * 绑定教务  肯定是要能登录 保存cache
     * 不关心什么班级专业名字什么的  我绑定完课表直接能查到，查到后存入cache
     * @return
     */
    @Override
    public Result<SysMember> bingjw(SysMember member) throws Exception {
        if (member.getUseraccount() != null) {
            member = sysMemberDao.selectBySId(member.getUseraccount());
            try {
                if (member == null) {
                    SysMember login = HtmlunitUtil.login(member);
                    SysMember studentInfo = HtmlunitUtil.getStudentInfo(login);
                    int insert = this.insert(studentInfo);
                    if (insert > 0) {
                        return Result.ok(member);
                    }
                } else
                    return Result.ok(member);
            } catch (Exception e) {
                return Result.error("插入会员表数据失败" + e);
            }
        }
        return Result.error("参数校验失败");
    }

    /**\
     * 是否绑定教务 0没有
     * @param id
     * @return
     */
    @Override
    public Integer selecBingtById(Long id) {
        return sysMemberDao.selecBingtById(id);
    }


    public List<Course> getStudentCourse(SysMember member, String team) throws Exception {

        int have = courseDao.isHave(member.getUseraccount(), team);
        List<Course> courseList = new ArrayList<>();
        //insert 查询数据库是否存在同类型课表
        if (have==0){
            courseList = HtmlunitUtil.getCourseList(member,team);
            if (courseList.size()>0) {
                courseDao.batchInsert(courseList);
            }else System.out.println("课表获取失败");
        }else  {
            //System.out.println("已存在相同表数据！");
            //查数据库
            courseList = courseDao.selectCourse(member.getUseraccount(),team);
            courseList.forEach(course -> {
                course.setWeeks(course.stringtoList(course.getWeekss()));
            });
        }

        return courseList;
    }

    // 是否需要重新 进教务网拉最新课表  status：是否刷新的标识
    //更多的参数  第几周、  刷新标志、
    public List<Course> getStudentCourse(SysMember member, int week, int flag, String team)  throws Exception {

        List<Course> courseList;
        if (flag == 1) {//刷新表单数据
            courseList = HtmlunitUtil.getCourseList(member, team);
            if (courseList.size() > 0) {
                courseDao.batchInsert(courseList);
            } else {
                return new ArrayList<>();
            }
        }else
            courseList = courseDao.selectCourse(member.getUseraccount(),team);
        // 筛选出 week周的数据   weekss变成List 出现null
        courseList.forEach(course -> {
            course.setWeeks(course.stringtoList(course.getWeekss()));
        });
        courseList = courseList.stream().filter(x -> x.getWeeks().get(0) <= week).collect(Collectors.toList());
        return courseList;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public SysMember selectById(Long id) {
        return this.sysMemberDao.selectById(id);
    }

    /**
     * 分页查询
     *
     * @param start 查询起始位置
     * @param limit 查询条数
     * @return 对象列表
     */
    @Override
    public List<SysMember> selectPage(int start, int limit) {
        return this.sysMemberDao.selectPage(start, limit);
    }

    /**
     * 查询所有
     *
     * @return 实例对象的集合
     */
    @Override
    public List<SysMember> selectAll() {
        return this.sysMemberDao.selectAll();
    }

    /**
     * 根据条件查询
     *
     * @return 实例对象的集合
     */
    @Override
    public List<SysMember> selectList(SysMember sysMember, Integer start, Integer limit) {
        return this.sysMemberDao.selectList(sysMember, start, limit);
    }

    /**
     * 新增数据
     *
     * @param sysMember 实例对象
     * @return 实例对象
     */
    @Override
    public int insert(SysMember sysMember) {
        UUID.randomUUID().toString().replaceAll("-", "");
        return this.sysMemberDao.insert(sysMember);
    }

    /**
     * 批量新增
     *
     * @param sysMembers 实例对象的集合
     * @return 生效的条数
     */
    @Override
    public int batchInsert(List<SysMember> sysMembers) {
        return this.sysMemberDao.batchInsert(sysMembers);
    }

    /**
     * 修改数据
     *
     * @param sysMember 实例对象
     * @return 实例对象
     */
    @Override
    public SysMember update(SysMember sysMember) {
        this.sysMemberDao.update(sysMember);
        return this.selectById(sysMember.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public int deleteById(Long id) {
        return this.sysMemberDao.deleteById(id);
    }

    /**
     * 查询总数据数
     *
     * @return 数据总数
     */
    @Override
    public int count() {
        return this.sysMemberDao.count();
    }
}





